#include "calculator.h"
#include <iostream>
#include <iomanip>     // 用于格式化输出 (std::fixed, std::setprecision)

#if 0
// main 函数，用于测试计算器
int main() 
{
    std::cout << "C++ Calculator. Enter 'exit' to quit." << std::endl;
    std::cout << "Supported operations: +, -, *, /, (), numbers (integers and decimals), unary minus." << std::endl;

    std::string expression;
    while (true) {
        std::cout << "Enter expression: ";
        std::getline(std::cin, expression); // 读取整行输入

        if (expression == "exit") {
            break;
        }

        if (expression.empty()) {
            continue; // 空输入，继续
        }

        try {
            // 设置浮点数输出精度
            std::cout << std::fixed << std::setprecision(10);
            double result = calculate(expression);
            std::cout << "Result: " << result << std::endl;
        } catch (const std::runtime_error& e) {
            // 捕获并打印解析过程中抛出的错误
            std::cerr << "Error: " << e.what() << std::endl;
        } catch (const std::exception& e) {
            // 捕获其他标准异常
            std::cerr << "An unexpected error occurred: " << e.what() << std::endl;
        } catch (...) {
            // 捕获所有未知异常
            std::cerr << "An unknown error occurred." << std::endl;
        }
        std::cout << std::endl;
    }

    std::cout << "Calculator exited. Goodbye!" << std::endl;
    return 0;
}

#else
#include <vector>
int main() 
{
    // 定义一系列用于测试的表达式字符串字面量
    std::vector<std::string> test_expressions = {
        "1 + 2",                // 简单加法
        "10 - 5",               // 简单减法
        "2 * 3",                // 简单乘法
        "10 / 2",               // 简单除法
        "1 + 2 * 3",            // 优先级测试: 1 + (2 * 3) = 7
        "(1 + 2) * 3",          // 括号测试: (1 + 2) * 3 = 9
        "10 - 4 / 2 + 1",       // 混合优先级: 10 - (4 / 2) + 1 = 10 - 2 + 1 = 9
        "2 * (3 + 4)",          // 括号与乘法: 2 * (3 + 4) = 14
        "1.5 + 2.5",            // 浮点数加法
        "10 / 3",               // 浮点数除法
        "  5   +   (2 * 3)  ",  // 包含大量空白的表达式
        "1 + 2 * (3 - 1) / 2",  // 复杂混合: 1 + 2 * 2 / 2 = 1 + 4 / 2 = 1 + 2 = 3
        "((1+2))",              // 多层括号
        // 错误测试用例
        "10 / 0",               // 除以零
        "1 + ",                 // 不完整的表达式
        "1 + a",                // 无效字符
        " (1 + 2 ",             // 括号不匹配
        "1 2",                  // 两个数字之间没有运算符
    };

    // 遍历并计算每个测试表达式
    for (const auto& expr : test_expressions) {
        std::cout << "Calculating \"" << expr << "\": ";
        try {
            double result = calculate(expr);
            // 设置输出精度为小数点后5位
            std::cout << std::fixed << std::setprecision(5) << result << std::endl;
        } catch (const std::runtime_error& e) {
            // 捕获并打印计算过程中抛出的错误
            std::cerr << "Error: " << e.what() << std::endl;
        }
    }

    return 0;
}
#endif